﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace LanLanKan
{
    class llk
    {
        //定义判断两个位置是否存在路径的方法
        public static bool findRouter(int[,] pos_status,int row1,int col1,int row2,int col2)
        {
            bool result = false;
            //1.判断（row1,col1)(row2,col2)是否0拐相连
            if (findRouter_0(pos_status, row1, col1, row2, col2))
                return true;
            //2.判断（row1,col1)(row2,col2)是否1拐相连
            if (findRouter_1(pos_status, row1, col1, row2, col2))
                return true;
            //3.判断（row1,col1)(row2,col2)是否2拐相连
            if (findRouter_2(pos_status, row1, col1, row2, col2))
                return true;
            return result;
        }

        private static bool findRouter_2(int[,] pos_status, int row1, int col1, int row2, int col2)
        {
            //1.搜索(row1,col1)的左方向
            for (int i = col1 - 1; i >= 0; i--)
            {
                if (pos_status[row1, i] > 0)//遇到障碍物，则终止该方向
                {
                    break;
                }
                else //空位置，则判断该位置是否与(row2,col2)0拐相连
                {
                    if (findRouter_1(pos_status, row1, i, row2, col2))
                        return true;//返回可消除
                }
            }
            //2.搜索(row1,col1)的右方向
            for (int i = col1 + 1; i <= Math.Sqrt(pos_status.Length) - 1; i++)
            {
                if (pos_status[row1, i] > 0)//遇到障碍物，则终止该方向
                {
                    break;
                }
                else //空位置，则判断该位置是否与(row2,col2)0拐相连
                {
                    if (findRouter_1(pos_status, row1, i, row2, col2))
                        return true;//返回可消除
                }
            }
            //3.搜索(row1,col1)的上方向
            for (int i = row1 - 1; i >= 0; i--)
            {
                if (pos_status[i, col1] > 0)//遇到障碍物，则终止该方向
                {
                    break;
                }
                else //空位置，则判断该位置是否与(row2,col2)0拐相连
                {
                    if (findRouter_1(pos_status, i, col1, row2, col2))
                        return true;//返回可消除
                }
            }
            //4.搜索(row1,col1)的下方向
            for (int i = row1 + 1; i <= Math.Sqrt(pos_status.Length) - 1; i++)
            {
                if (pos_status[i, col1] > 0)//遇到障碍物，则终止该方向
                {
                    break;
                }
                else //空位置，则判断该位置是否与(row2,col2)0拐相连
                {
                    if (findRouter_1(pos_status, i, col1, row2, col2))
                        return true;//返回可消除
                }
            }
            return false;
        }

        private static bool findRouter_1(int[,] pos_status, int row1, int col1, int row2, int col2)
        {
            //便历与(row1,col1)0拐相连的点
            //1.搜索(row1,col1)的左方向
            for (int i = col1 - 1; i >= 0; i--)
            {
                if(pos_status[row1, i] > 0)//遇到障碍物，则终止该方向
                {
                    break;
                }
                else //空位置，则判断该位置是否与(row2,col2)0拐相连
                {
                    if (findRouter_0(pos_status, row1, i, row2, col2))
                        return true;//返回可消除
                }
            }
            //2.搜索(row1,col1)的右方向
            for (int i = col1 + 1; i <= Math.Sqrt(pos_status.Length)-1; i++)
            {
                if (pos_status[row1, i] > 0)//遇到障碍物，则终止该方向
                {
                    break;
                }
                else //空位置，则判断该位置是否与(row2,col2)0拐相连
                {
                    if (findRouter_0(pos_status, row1, i, row2, col2))
                        return true;//返回可消除
                }
            }
            //3.搜索(row1,col1)的上方向
            for (int i = row1 - 1; i >= 0; i--)
            {
                if (pos_status[i,col1 ] > 0)//遇到障碍物，则终止该方向
                {
                    break;
                }
                else //空位置，则判断该位置是否与(row2,col2)0拐相连
                {
                    if (findRouter_0(pos_status, i,col1, row2, col2))
                        return true;//返回可消除
                }
            }
            //4.搜索(row1,col1)的下方向
            for (int i = row1 + 1; i <= Math.Sqrt(pos_status.Length) - 1; i++)
            {
                if (pos_status[i, col1] > 0)//遇到障碍物，则终止该方向
                {
                    break;
                }
                else //空位置，则判断该位置是否与(row2,col2)0拐相连
                {
                    if (findRouter_0(pos_status, i, col1, row2, col2))
                        return true;//返回可消除
                }
            }
            return false;
        }

        //定义判断两个位置是否能0拐相连
        public static bool findRouter_0(int[,] pos_status, int row1, int col1, int row2, int col2)
        {
            //判断（row1,col1)(row2,col2)是否横向直线相连
            if (row1 == row2)//判断（row1,col1)->(row2,col2)是否存在障碍物
            {
                int count = 0;//标注中间障碍物的个数
                int min = col1 < col2 ? col1 : col2;
                int max = col1 > col2 ? col1 : col2;
                for (int i = min + 1; i <= max - 1; i++)
                {
                    //判断中间一个位置是否存在物体                    
                    if (pos_status[row1, i] > 0)
                    {
                        count++;
                        break;
                    }
                }
                //判断是否遇见障碍物
                if (count == 0)
                {
                    return true;
                }
            }
            //判断（row1,col1)(row2,col2)是否纵向直线相连
            if (col1 == col2)
            {
                if (col1 == col2)//判断（row1,col1)->(row2,col2)是否存在障碍物
                {
                    int count = 0;//标注中间障碍物的个数
                    int min = row1 < row2 ? row1 : row2;
                    int max = row1 > row2 ? row1 : row2;
                    for (int i = min + 1; i <= max - 1; i++)
                    {
                        //判断中间一个位置是否存在物体                    
                        if (pos_status[i,col1] > 0)
                        {
                            count++;
                            break;
                        }
                    }
                    //判断是否遇见障碍物
                    if (count == 0)
                    {
                        return true;
                    }
                }
            }
            return false;
        }

       public static bool checkWinner(int[,] pos_status)
        {
            int N=(int) Math.Sqrt(pos_status.Length);
            for (int i = 0; i < N; i++)
                for (int j = 0; j < N; j++)
                {
                    if (pos_status[i, j] > 0)
                        return false;
                }
                    return true;
        }
    }
}
